package com.scuec.tourismwebsite.controller;

import com.scuec.tourismwebsite.entity.BoutiqueTour;
import com.scuec.tourismwebsite.service.BoutiqueTourService;
import com.scuec.tourismwebsite.util.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import javax.validation.Valid;
import java.io.File;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

@CrossOrigin(origins = "http://localhost:5173")
@RestController
@RequestMapping("/tour/v1/boutiqueTours")
public class BoutiqueTourController {

    @Autowired
    private BoutiqueTourService boutiqueTourService;

    @GetMapping("query")
    public List<BoutiqueTour> findall() {
        return boutiqueTourService.findAll();
    }

    @GetMapping
    public ResponseEntity<Page<BoutiqueTour>> getAllBoutiqueTours(Pageable pageable) {
        Page<BoutiqueTour> page = boutiqueTourService.findAll(pageable);
        return ResponseEntity.ok(page);
    }



    @GetMapping("/{boutique_id}")
    public ResponseEntity<?> getBoutiqueTourById(@PathVariable Integer boutique_id) {
        Optional<BoutiqueTour> tourOptional = boutiqueTourService.findById(boutique_id);
        return tourOptional.map(ResponseEntity::ok)
                .orElseGet(() -> ResponseEntity.notFound().build());
    }

    @PostMapping
    public ResponseEntity<BoutiqueTour> addBoutiqueTour(@Valid @RequestBody BoutiqueTour boutiqueTour, @RequestParam("image") MultipartFile image,@RequestParam(value = "boutique_id", required = false, defaultValue = "0") Integer boutique_id) {
        BoutiqueTour addedTour = boutiqueTourService.add(boutiqueTour);

        if (!image.isEmpty()) {
            String image_url = uploadTourImage(image, addedTour.getBoutique_id());
            addedTour.setImage_url(image_url);
            boutiqueTourService.updatePhoto(addedTour.getBoutique_id(), image_url);
        }

        return ResponseEntity.ok(addedTour);
    }

    @PutMapping("/{boutique_id}")
    public ResponseEntity<BoutiqueTour> updateBoutiqueTour(@PathVariable Integer boutique_id, @RequestBody BoutiqueTour boutiqueTour) {
        // 确保前端发送的 boutique_id 与 URL 中的 boutique_id 一致
        if (boutiqueTour.getBoutique_id() != null && boutiqueTour.getBoutique_id() != boutique_id) {
            throw new IllegalArgumentException("请求的团编号与实体中的团编号不匹配");
        }
        BoutiqueTour updatedTour = boutiqueTourService.update(boutique_id, boutiqueTour);
        return ResponseEntity.ok(updatedTour);
    }

    @DeleteMapping("/{boutique_id}")
    public ResponseEntity<Void> deleteBoutiqueTour(@PathVariable Integer boutique_id) {
        boutiqueTourService.delete(boutique_id);
        return ResponseEntity.ok().build();
    }

    @GetMapping("/search")
    public ResponseEntity<Page<BoutiqueTour>> searchBoutiqueTours(@RequestParam String tourName, Pageable pageable) {
        Page<BoutiqueTour> page = boutiqueTourService.searchByTourName(tourName, pageable);
        return ResponseEntity.ok(page);
    }


    @PostMapping("upload")
    public String uploadTourImage(MultipartFile file, @RequestParam("id") Integer boutique_id) {
        if (boutique_id == null) {
            throw new IllegalArgumentException("团编号无效");
        }

        String oldFileName = file.getOriginalFilename();
        System.out.println(oldFileName);
        String fileExtension = oldFileName.substring(oldFileName.lastIndexOf("."));
        String filePath = FileUtil.getUploadFilePath() + "/attractions";
        File dir = new File(filePath);
        if (!dir.exists()) {
            dir.mkdirs(); // 创建目录（如果不存在）
        }

        // 生成新的文件名，使用当前时间戳避免文件名冲突
        String newFileName = System.currentTimeMillis() + fileExtension;
        // 获取文件上传的目录
        String image_url = newFileName;
        System.out.println(newFileName);
        try {
            FileUtil.uploadFile(file.getBytes(), filePath, newFileName);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 更新数据库中的图片 URL
        boutiqueTourService.updatePhoto(boutique_id, image_url);
        return newFileName;
    }

    @PutMapping("/decreaseAvailability/{boutique_id}")
    public int decreaseAvailability(@PathVariable Integer boutique_id) {
        return boutiqueTourService.decreaseAvailability(boutique_id);
    }
}






